/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestion;

import Graphisme.Resultat;
import Graphisme.Resultats;
import adapdateurs.Adapdateur;
import adapdateurs.HotelDeXml;
import adapdateurs.VolsSQL;
import etl.Extract;
import etl.Transform;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.JScrollPane;
import moyensDeTransport.Avion;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

/**
 *
 * @author BENAMMAR Riyadh
 */
public class Gestion {

    private String informationRecherchee;
    private String cataloguePath;

    public Gestion() {
        informationRecherchee = "hotel";
        cataloguePath = "src\\Catalogue.xml";
    }

    public Vector<Vector> chercher(Map<String, String> informations) {
        String dateAller = informations.get("dateAller");
        String dateRetour = informations.get("dateRetour").toString();
        int decalageDepart = Integer.parseInt(informations.get("decalageDepart"));
        int decalageRetour = Integer.parseInt(informations.get("decalageRetour"));
        String villeDepart = informations.get("villeDepart");
        String villeDestination = informations.get("villeDestination");
        boolean besoinHotel = Boolean.parseBoolean(informations.get("besoinHotel").toString());
        String [] reqs={"vols","bateau"};
        String requete = "";
        int i=0;
        Extract extract = new Extract();
        Transform transform = new Transform();
        List<Object> resultatsAller =new ArrayList<>();
        List<Object> resultatsRetour = new ArrayList<>();
        List<Element> elements =new ArrayList<>();
        Adapdateur adapdateur=null;
        Element element=new Element("donnees");
        for (i = 0; i < reqs.length; i++) {
            extract.setInformationRecherchee(reqs[i]);
            elements = extract.appliquer();
            element = elements.get(0);
            transform.appliquer(element.getChild("source"));
            adapdateur = transform.getAdapdateur();
        requete = adapdateur.traduire("SRC:" + villeDepart + ":DST:" + villeDestination + ":DTA:" + dateAller + ":DEC:" + decalageDepart);
        resultatsAller.addAll(adapdateur.executerRequete(requete));
        requete = adapdateur.traduire("SRC:" + villeDestination + ":DST:" + villeDepart + ":DTA:" + dateRetour + ":DEC:" + decalageRetour);
        resultatsRetour.addAll(adapdateur.executerRequete(requete));
        }
        System.out.println("contenu: "+resultatsAller.toString());
       /* extract.setInformationRecherchee("bateau");
        transform.appliquer(extract.appliquer().get(0).getChild("source"));
        adapdateur=transform.getAdapdateur();
        */
        
        
        List<Object> hebergement=new ArrayList<>();
            if (besoinHotel) {
                extract.setInformationRecherchee("hotel");
                elements = extract.appliquer();
                element = elements.get(0);
                transform.appliquer(element.getChild("source"));
                adapdateur = transform.getAdapdateur();
                requete=adapdateur.traduire("Ville:"+villeDestination);
                List r=adapdateur.executerRequete(requete);
                for (int k = 0; k < r.size(); k++) {
                    hebergement.add(r.get(k));
                }
            }
            int t1=resultatsAller.size();
            int t2=resultatsRetour.size();
            int t3=hebergement.size();
            int taille;
            if(t1==0)
                if(t2==0)
                    if(t3==0)
                        taille = 0;
                    else taille=t3;
                else if( t3 == 0)
                    taille = t2;
                else taille = t2*t3;
            else if( t2==0 )
                if(t3==0)
                    taille = t1;
                else taille=t1*t3;
            else if(t3==0)
                taille=t1*t2;
            else taille=t1*t2*t3;
        Resultat[] tmp = new Resultat[taille];
        int cpt=0;
        int j=0,k=0;;
        List<Object> aller=null;
        List<Object> retour=null;
        List<Object> heb=null;
        System.out.println("taille= "+taille);
        for (i = 0; i < t1+1; i++) {
            aller=new ArrayList<>();
            
            if(i<t1)aller.add(resultatsAller.get(i));
            for (j = 0; j < t2+1; j++) {
                retour=new ArrayList<>();
                if(j<t2){
                    retour.add(resultatsRetour.get(j));
                    //System.out.println("retour: "+retour.toString());
                } 
                for(k=0;k<t3+1;k++){
                    heb=new ArrayList<>();
                    if(k<t3)heb.add(hebergement.get(k));
                    //else break;
                    if(cpt==taille)break;
                    
                tmp[cpt++] = new Resultat(aller, retour, heb);
                }
            }
        
        }
        
        /*for (int i = 0; i < tmp.length; i++) {
            extract.setInformationRecherchee("vols");
            elements = extract.appliquer();
            element = elements.get(0);
            transform.appliquer(element.getChild("source"));
            adapdateur = transform.getAdapdateur();
            requete = adapdateur.traduire("SRC:" + villeDestination + ":DST:" + villeDepart + ":DTA:" + dateRetour + ":DEC:" + decalageRetour);
            List<Object> resultatsRetour = adapdateur.executerRequete(requete);
            List<Object> hebergement=new ArrayList<>();
            if (besoinHotel) {
                extract.setInformationRecherchee("hotel");
                elements = extract.appliquer();
                element = elements.get(0);
                transform.appliquer(element.getChild("source"));
                adapdateur = transform.getAdapdateur();
                requete=adapdateur.traduire("Ville:"+villeDestination);
                List r=adapdateur.executerRequete(requete);
                for (int j = 0; j < r.size(); j++) {
                    hebergement.add(r.get(j));
                }
            }
            tmp[i] = new Resultat(resultatsAller, resultatsRetour, hebergement);
        }*/
        //System.out.println("Jusqu'ici tout est bon !!!");

        Resultats dialog = new Resultats(tmp);
        dialog.setVisible(true);
        //JScrollPane jsp=new JScrollPane(dialog);


        // d'abord il faut chercher l'aeroport le plus proche pour faire le trajet
        //il faut selectionner toutes les villes du meme pays
        // ensuite en calcul la ville avec son aero port le plus proche et tester s'il y a 
        // une ligne directe de cette aeroport vers la ville destination ou une ville proche de la ville destination



        // et s'il y a pas on cherche un bateau s'il on en aura besoin
        // ensuite chercher sur les réseax férroviaires 
        // ensuite selon la tolérence du retard de l'utilisateur on cherche des hotels ou auberges libres
        return null;
    }

    public Object getAdapdateur(String information) {
        informationRecherchee = information;
        String resultat = "";
        Document document = null;
        Element racine;
        SAXBuilder sxb = new SAXBuilder();
        try {
            //On a crée un nouveau document JDOM avec en argument le fichier XML
            //Le parsing est terminé
            document = sxb.build(new File(cataloguePath));
        } catch (JDOMException ex) {
            System.err.println("impossible de parser le catalogue");
        } catch (IOException ex) {
            System.err.println("fichier introvable");
        }
        //On initialise un nouvel élément racine avec l'élément racine du document.
        racine = document.getRootElement();
        List<Element> children = racine.getChildren();
        Iterator iter = children.iterator();
        while (iter.hasNext()) {
            Element child = (Element) iter.next();
            if (child.getAttribute("nom").toString().equalsIgnoreCase(information)) {
                resultat = child.getChildText("adapdateur");
                break;
            }
        }

        switch (resultat) {
            case "HotelDeXml":
                return new HotelDeXml();
            case "VolsSQL":
                return new VolsSQL();
        }
        return null;
    }
}
